-
Notifications
You must be signed in to change notification settings - Fork 94
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support ClassData and TokenData not according to ICS-721 spec #1039
Support ClassData and TokenData not according to ICS-721 spec #1039
Conversation
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## feat/ics721-impl #1039 +/- ##
===================================================
Coverage ? 67.25%
===================================================
Files ? 196
Lines ? 20275
Branches ? 0
===================================================
Hits ? 13635
Misses ? 6640
Partials ? 0 ☔ View full report in Codecov by Sentry. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you @yito88 for tracking down the Data format issue. 🙏🏻
Handle Data as just String if ics721-data feature flag isn't set
I could come up with another approach for handling any Data
format, allowing us to check if the Data is in ICS-721 structure. We shouldn't need to define a feature flag.
Please check out this branch and apply if that makes sense to you. I couldn’t open another PR to your branch.
Change functions and some arguments for ClassData and TokenData to use Option because URI and data (ClassData, TokenData) could not exist
Shouldn't the get_*
methods under the NftContext
and NftClassContext
always return some values? Is it viable for instance we mint a token by only having a pair of class and token ids without any URIs and data?
Similar question applies to the create_or_update_class_execute
and mint_nft_execute
methods. Do you handle e.g. the TokenUri
and TokenData
creation locally as the host specifies, or won't you need them at all?
Check the length of TokenUris and TokenData in send_nft_transfer_validate()
Let's define a validate_basic()
method for the PacketData
so can call that in places we need similar checks. I've showcased that in this branch.
@Farhad-Shabani Thank you! I merged your commits for the data format.
Technically, we can mint a token only with class and token IDs. In my testing, some optional data were empty. I'm testing actual chains. |
That's appreciated. Thus, I will be waiting for your confirmation before we proceed with this PR.
Thanks! Good to know this. Let me know plz the actual test results as well. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just left a comment and please fix the CI catch with the cargo doc
, then good to go. 🎉 Thank you @yito88 for implemeting the custom (de)serialization.
} | ||
} | ||
|
||
impl TryFrom<RawPacketData> for PacketData { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's keep these TryFrom
and From
conversions as they should work fine. IIUC, we hit the “null” issue only if someone tries to obtain PacketData
proto type from a JSON string. And, this actually stems from the fact that the .proto
definitions and hence the Go compiler allow nullable fields, which shouldn't be the case. I noticed that ibc-go
handles this by adding (gogoproto.nullable) = false
to their .proto
files.
Actually, I am thinking of keeping the nft-transfer
types' crate complete in terms of providing needed conversions, in case, any other implementors need it.
* feat: establish ICS-721 boilerplate, ready for new additions (#1012) * chore: establish ics721 boilerplate, ready for new additions * nit * Implement ICS-721 NFT transfer (#1020) * WIP: add types and contexts * WIP: add events * WIP: implement modules * add send_transfer * add recv and refund handlers * add tests * fix send and recv * fix context and add tests * fix fmt * fix for CI * fix messages and serde * fix comments * Add (de)serialization tests for `DataValue`, `TokenUri`, and `ClassUri` types (#1027) * WIP: add types and contexts * WIP: add events * WIP: implement modules * add send_transfer * add recv and refund handlers * add tests * fix send and recv * fix context and add tests * fix fmt * fix for CI * fix messages and serde * fix comments * Stub out DataValue Borsh unit test * Add basic borsh (de)ser roundtrip tests * Add basic serde roundtrip tests for DataValue * Add json (de)serialization tests * Add roundtrip tests for TokenUri * Add roundtrip tests for ClassUri * Remove ignore statement on a test * Resolve clippy warning * Change packet data dummy json strings to use camel case * Configure nft-transfer app under std feature flag * Move cfg statement * Add nft-transfer feature * Add nft-transfer feature * Remove nft-transfer feature from default features * Remove `optional = true` from `http` dependency --------- Co-authored-by: yito88 <[email protected]> * fix: calculate trace hash from both class ID and token ID (#1032) * trace hash with class ID and token ID * add serde flag * Fix ClassData and TokenData encoding in NonFungiblePacketData (#1038) * fix encoding for ClassData and TokenData * fix Cargo.toml * Support ClassData and TokenData not according to ICS-721 spec (#1039) * skip validation, make some data optional * check the length of token_uri and token_data * fix to set TokenData and TokenUri at once * imp: add validate_basic method for PacketData * imp: allow any format for Data + define parse_as_ics721_data method * fmt and clippy * custom serde packet data with option * add a test * restore conversions --------- Co-authored-by: Farhad Shabani <[email protected]> * chore: add unclog * nit: fix docstrings --------- Co-authored-by: Yuji Ito <[email protected]> Co-authored-by: Sean Chen <[email protected]> Co-authored-by: yito88 <[email protected]>
* feat: establish ICS-721 boilerplate, ready for new additions (#1012) * chore: establish ics721 boilerplate, ready for new additions * nit * Implement ICS-721 NFT transfer (#1020) * WIP: add types and contexts * WIP: add events * WIP: implement modules * add send_transfer * add recv and refund handlers * add tests * fix send and recv * fix context and add tests * fix fmt * fix for CI * fix messages and serde * fix comments * Add (de)serialization tests for `DataValue`, `TokenUri`, and `ClassUri` types (#1027) * WIP: add types and contexts * WIP: add events * WIP: implement modules * add send_transfer * add recv and refund handlers * add tests * fix send and recv * fix context and add tests * fix fmt * fix for CI * fix messages and serde * fix comments * Stub out DataValue Borsh unit test * Add basic borsh (de)ser roundtrip tests * Add basic serde roundtrip tests for DataValue * Add json (de)serialization tests * Add roundtrip tests for TokenUri * Add roundtrip tests for ClassUri * Remove ignore statement on a test * Resolve clippy warning * Change packet data dummy json strings to use camel case * Configure nft-transfer app under std feature flag * Move cfg statement * Add nft-transfer feature * Add nft-transfer feature * Remove nft-transfer feature from default features * Remove `optional = true` from `http` dependency --------- Co-authored-by: yito88 <[email protected]> * fix: calculate trace hash from both class ID and token ID (#1032) * trace hash with class ID and token ID * add serde flag * Fix ClassData and TokenData encoding in NonFungiblePacketData (#1038) * fix encoding for ClassData and TokenData * fix Cargo.toml * Support ClassData and TokenData not according to ICS-721 spec (#1039) * skip validation, make some data optional * check the length of token_uri and token_data * fix to set TokenData and TokenUri at once * imp: add validate_basic method for PacketData * imp: allow any format for Data + define parse_as_ics721_data method * fmt and clippy * custom serde packet data with option * add a test * restore conversions --------- Co-authored-by: Farhad Shabani <[email protected]> * chore: add unclog * nit: fix docstrings --------- Co-authored-by: Yuji Ito <[email protected]> Co-authored-by: Sean Chen <[email protected]> Co-authored-by: yito88 <[email protected]>
Description
ClassUri
,ClassData
,TokenUris
, andTokenData
to decodenull
HandleAllowing to check if the Data is in ICS-721 structureData
as just String ifics721-data
feature flag isn't setcw-ics721
implementation uses its own structureOption
because URI and data (ClassData, TokenData) could not existTokenUris
andTokenData
insend_nft_transfer_validate()
PR author checklist:
unclog
.docs/
).Reviewer checklist:
Files changed
in the GitHub PR explorer.